package com.jugheadzhou.kafka.producer.handler;

import com.jugheadzhou.kafka.core.exception.KafkaMessageSendException;
import com.jugheadzhou.kafka.producer.enums.ResultEnum;
import com.jugheadzhou.kafka.producer.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 自定义全局异常处理
 *
 * @author jugheadzhou
 * @date 2021年9月23日
 */
@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {

    /**
     * 自定义全局异常处理 - 未知异常
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleException(Exception e) {
        log.error("系统未知异常: {}", e.getMessage(), e);
        return ResponseEntity.ok(ResultEnum.INTERNAL_SERVER_ERROR);
    }

    /**
     * 自定义全局异常处理 - kafka消息发送异常
     */
    @ExceptionHandler(value = KafkaMessageSendException.class)
    public ResponseEntity<?> kafkaMessageSendExceptionHandler(KafkaMessageSendException e) {
        log.error("kafka消息发送异常: {}", e.getMessage(), e);
        return ResponseEntity.ok(ResultEnum.FAIL);
    }

    /**
     * 自定义全局异常处理 - 业务异常
     */
    @ExceptionHandler(value = BusinessException.class)
    public ResponseEntity<?> businessExceptionHandler(BusinessException e) {
        log.error("业务异常: {}", e.getMessage(), e);
        return ResponseEntity.ok(ResultEnum.FAIL);
    }

    /**
     * 自定义全局异常处理 - 参数检验异常
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity<?> methodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error("参数检验异常: {}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return ResponseEntity.ok(ResultEnum.BAD_PARAMETER);
    }


}
